package controllers;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;

import models.MMSMO;
import models.SiteConfig;
import models.Usuario;
import play.Logger;
import play.mvc.Controller;
import util.TwitPicCommand;

public class TarefaMMS extends Controller {
	public static void publicar() {
		try {
			List<MMSMO> mensagens = MMSMO.outstandingMessages().fetch();

			for (MMSMO mensagem : mensagens) {
				if (!tratarOriginador(mensagem))
					continue;

				Logger.info("Publicando Mensagem (id=" + mensagem.oid + ")");

				if (tratarMensagem(mensagem))
					mensagem.update();
			}
		} catch (Exception exc) {
			Logger.warn(exc, "Erro durante publicacao");
		}
	}

	private static boolean tratarMensagem(MMSMO mensagem) throws Exception {
		TwitPicCommand twitPic = TwitPicCommand.newInstance();
		String directToUser = SiteConfig.load().getConfig(
				"twitter.directToUser");

		mensagem.setDataPublicacao(new Date());

		String textoMensagem = String.format("@%s %s (via @%s)", directToUser,
				mensagem.getSubject(), mensagem.getUsuarioId());

		twitPic.setMessage(textoMensagem);

		{
			Multipart content = (Multipart) mensagem.asMimeMessage()
					.getContent();
			boolean mediaSet = false;
			byte[] mediaContentSet = new byte[0];
			for (int i = 0; i < content.getCount(); i++) {
				BodyPart bodyPart = content.getBodyPart(i);

				if (bodyPart.getContentType().startsWith("image/")) {
					byte[] mediaContent = copyContent(bodyPart);

					if (mediaContent.length > mediaContentSet.length) {
						twitPic.setMedia(mediaContent);

						mediaSet = true;

						mediaContentSet = mediaContent;
					}
				}
			}

			if (mediaSet) {
				return twitPic.send();
			}
		}

		return false;
	}

	private static byte[] copyContent(BodyPart bodyPart) throws IOException,
			MessagingException {
		InputStream inputStream = bodyPart.getInputStream();
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buf = new byte[4096];

		int nRead = -1;

		while (-1 != (nRead = inputStream.read(buf)))
			baos.write(buf, 0, nRead);

		return baos.toByteArray();
	}

	private static boolean tratarOriginador(MMSMO mensagem) {
		boolean bValido = true;

		mensagem.setDataPublicacao(new Date());

		Usuario usuarioOriginador = Usuario.findByFrom(mensagem.getFrom());

		if (null != usuarioOriginador) {
			mensagem.setUsuarioId(usuarioOriginador.getLogin());

			bValido = true;
		} else {
			bValido = false;
		}

		return bValido;
	}
}
